// 一、数组约束
// 1. 类型 + 字面量[]
let arr:number[]
arr = [1,2,3,4]

// 2. 使用泛型约束数组格式
let arr1:Array<string|number>
arr1 = [1,'2']

//3. 使用interface约定数组格式
interface TestType {
	[index:number]:number|string
}
let arr2:TestType
arr2 = [1,2,'3']

// 4. 元组，固定数量的集合
// 经纬度
let pos:[number,number]
pos = [102.33,60.22]


// 二、枚举
// 有固定特征的数据：星期、订单状态
enum Week {
	'星期一'=1,
	'星期二',
	'星期三',
	'星期四',
	'星期五',
	'星期六',
	'星期天',
}
console.log(Week[1],Week['星期一'],Week[2]);

// 示例
// 后端下发订单数据包
// 30 待支付   42 待发货    53 已签收
interface GoodType{
	name:string
	price:number
	status:number
}
let orders:Array<GoodType> = [
	{name:'商品1',price:1999,status:30},
	{name:'商品1',price:1999,status:42},
	{name:'商品1',price:1999,status:53}
]
enum OrderStatus {
	'待支付' = 30,
	'待发货' = 42,
	'已签收' = 53
}

for(let i=0;i<orders.length;i++){
	console.log(`${orders[i].name}商品，订单状态：${OrderStatus[orders[i].status]}`);
}

// 三、函数拓展
// 对象内部this指向的正确性
// let user = {
// 	name:'三丰',
// 	showName(){
// 		console.log(this.name);
// 	}
// }


// let user = {
// 	name:'三丰',
// 	showName(){
// 		return function(){
// 			console.log(this.name);  //会告警，因为ts识别到了this指向的问题
// 		}
// 	}
// }


// let user = {
// 	name:'三丰',
// 	showName(){
// 		// this
// 		return ()=>{
// 			console.log(this.name);  //箭头函数指向跟所处的环境有关
// 		}
// 	}
// }

// 函数重载   可以让多功能的逻辑函数可读性更强
// 需求：封装一个函数，对传入的参数进行反转操作，并返回跟入参类型相同的反转结果
// 'Hello' ---> 'olleH'
// 123 ---> 321
// [1,2,3] ---> [3,2,1]
// console.log('hello'.split(''));
function reverseFuc(arg:string):string
function reverseFuc(arg:number):number
function reverseFuc(arg:Array<number>):Array<number>
function reverseFuc(arg:string|number|Array<number>):string|number|Array<number>{
	if(typeof arg == 'string'){ //字符串
		return arg.split('').reverse().join('')
	}
	if(typeof arg == 'number'){ //数字
		return parseInt((arg+'').split('').reverse().join(''))
	}
	return arg.reverse() //数组
}